1和new Number(1)有什么区别
author: @Tiffanysbear
总结,两者的区别就是原始类型和包装对象的区别。
什么是包装对象
对象Number、String、Boolean分别对应数字、字符串、布尔值,可以通过这三个对象把原始类型的值变成(包装成)对象:
1 | var v1 = new Number(123); |
我们来看下实际的v1、v2、v3是什么呢?
1 | typeof v1;// "object" |
可以理解的是,v1此时是对象,===比较的是内存地址,因此跟数字Number 123不相等;可是为什么v1 == 123得到的值会是true呢?
那这就是包装对象在使用时的问题了。再来理解一下什么是原始类型。
什么是原始类型
比如123这类就是原始类型,原始类型并不是一个对象,因此并没有对象具有的一些属性和方法;但是为什么能调用(123).toFixed()这些方法呢?
原因就是这些方法都是像包装对象”借用”来的,toFixed方法是在Number对象原型上的方法。
1 | (123).toFixed === Number.prototype.toFixed // true |
JS求值
JS在求值运算时,总是会求出原始资料的值,而不是用对象。如下面的例子:
1 | var a = new Number(122); |
但是要注意 new Boolean
的用法,只有当 new Boolean 的参数值为 null 或者 undefined 时,求值转换的原始资料的值才是false,其他情况都是true;
1 | !!(new Boolean(false)) // true |
所以尽量不要使用 new Boolean 这个包装对象进行赋值,否则会产生一些误会。
运算时调用 valueOf 和 toString 的优先级
先说下结论:
1、进行对象转换时(alert(e2)),优先调用 toString 方法,如没有重写 toString 将调用 valueOf 方法,如果两方法都不没有重写,但按 Object 的 toString 输出。
2、进行强转字符串类型时将优先调用 toString 方法,强转为数字时优先调用 valueOf。
3、在有运算操作符的情况下,valueOf的优先级高于toString。
以下是三个例子
第一个:
1 | let e2 = { |
第二个:
1 | let e3 = { |
第三个:
1 | Object.prototype.toString = null; |